unit TVScannerManager_Unit;

interface

uses Forms,
     SysUtils,
     MSHTML,
     InformatiePopup_Unit,
     InternetPagina_Unit,
     InternHttpClient_Unit,
     Introductie_Unit,
     TaskIcon_Unit,
     TVGidsNLParser_Unit,
     TVGidsNLProgramma_unit,
     TVGidsNLProgrammaLijst_unit,
     Mededeling_Unit;

const
  TVScannerVersie = 'TVScanner V1.0.2.3';

type
  TTVScannerManager = class(TObject)
  private
    { Private declarations }
    informatiePopup: TInformatiePopup_Form;
    internetPagina: TInternetPagina_Form;
    internHttpClient: TInternHttpClient;
    introductie: TIntroductie_Form;
    taskIcon: TTaskIcon;
    TVGidsNLParser: TTVGidsNLParser;
    TVGidsNLProgrammaLijst: TTVGidsNLProgrammaLijst;
    eersteKeer: Boolean;
    procedure onPopupMenuClick(Sender: TObject);
    procedure showInternetPagina(pagina: String);
    procedure mededelingOnClickEvent();
  public
    { Public declarations }
    procedure startManager;
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;
    procedure triggerMededeling();
    procedure triggerTVGidsNLDownload();
    procedure processTVGidsNLDownload(pagina: IHTMLDocument2);
    property var_InformatiePopup: TInformatiePopup_Form read informatiePopup write informatiePopup;
    property var_InternetPagina: TInternetPagina_Form read internetPagina write internetPagina;
    property var_InternHttpClient: TInternHttpClient read internHttpClient write internHttpClient;
    property var_Introductie: TIntroductie_Form read introductie write introductie;
    property var_TaskIcon: TTaskIcon read taskIcon write taskIcon;
    property var_TVGidsNLParser: TTVGidsNLParser read TVGidsNLParser write TVGidsNLParser;
  end;

implementation

  //////////////////////////////////////////////////////////////////////////////
  //object methoden
  //////////////////////////////////////////////////////////////////////////////

  {
    * mededelingOnClickEvent
  }
  procedure TTVScannerManager.mededelingOnClickEvent();
  begin

    //internetPagina tonen met active mededeling adres pagina
    internetPagina.showInternetPagina(informatiePopup.getActiveMededeling().var_mededelingOnClickAdres);
  end;

  {
    * triggerMededeling
  }
  procedure TTVScannerManager.triggerMededeling();
  var
    mededeling: TMededeling;
    status: TMededelingStatus;
  begin

    //controleren of een mededeling actief is
    if Assigned(informatiePopup.getActiveMededeling()) then
    begin
      //er is een mededeling actief

      //controleren of activeMededeling nog zichtbaar moet blijven
      if not informatiePopup.getActiveMededeling().checkVisible() then
      begin

        //mededeling verbergen
        informatiePopup.hideMededeling(True);
      end;
    end
    else
    begin
      //er is geen mededeling actief

      //TVGidsNL Programma lijst controleren of een programma zometeen begint

      if Assigned(TVGidsNLProgrammaLijst) and TVGidsNLProgrammaLijst.first() then
      begin
        //we hebben TVGidsNLProgramma's

        //nieuwe mededeling aanmaken
        mededeling := TMededeling.Create();

        //TVGidsNLProgramma's doorlopen
        repeat

          //TVGidsNLProgramma omzetten naar een Mededeling
          mededeling.parsTVGidsNLProgrammaData(TVGidsNLProgrammaLijst.getProgramma(), mededelingOnClickEvent);

          //status van deze mededeling berekenen
          status := mededeling.var_status;      

          //TVGidsNLProgramma verwijderen bij geweest of onbekend status
          if (status = MEDEDELING_VERLEDEN) or
             (status = MEDEDELING_ONBEKEND) then
          begin

            //TVGidsNLprogramma verwijderen
            //TVGidsNLProgrammaLijst.delete();
          end;

          //TVGidsNLProgramma verwijderen bij gemeld status en op dit moment
          if (status = MEDEDELING_MELDEN) then //status om te tonen
          begin

            //TVGidsNLprogramma tijdelijk niet tonen (5 minuten)
            TVGidsNLProgrammaLijst.getProgramma().uitstellen(5);
          end;

          //TVGidsNLProgramma verwijderen bij gemeld status en op dit moment
          if (status = MEDEDELING_OP_DIT_MOMENT) then //status om te tonen
          begin

            //TVGidsNLprogramma tijdelijk niet tonen (15 minuten)
            TVGidsNLProgrammaLijst.getProgramma().uitstellen(15);
          end;

          //vertraging toevoegen om niet 100% CPU tijd te gebruiken
          Sleep(10);

          //messages processen om TVScanner niet te laten vast lopen
          Application.ProcessMessages();

          //stoppen tot we geen programma's meer hebben of een te melden programma gevonden hebben
        until not TVGidsNLProgrammaLijst.next() or
              (status = MEDEDELING_MELDEN) or
              (status = MEDEDELING_OP_DIT_MOMENT);

        //controleren of we het active mededeling moeten tonen
        if (status = MEDEDELING_MELDEN) or
           (status = MEDEDELING_OP_DIT_MOMENT) then
        begin

          //mededeling tonen
          informatiePopup.showEenMededeling(mededeling);
        end
        else
        begin

          //mededeling vrijgeven als hiermee niets wordt gedaan
          if Assigned(mededeling) then
            mededeling.Free();
        end;
      end;
    end;
  end;

  {
    * triggerTVGidsNLDownload
  }
  procedure TTVScannerManager.triggerTVGidsNLDownload();
  begin

    //persoonlijke TVGidsNL pagina laten ophalen
    internetPagina.getPersoonlijkeVolledigOverzichtGenrePagina();
  end;

  {
    * processTVGidsNLDownload
  }
  procedure TTVScannerManager.processTVGidsNLDownload(pagina: IHTMLDocument2);
  var
    status: TTVGidsNLResultaat;
    actieveTVScannerVersie: String;
  begin

    //status van pagina ophalen
    status := TVGidsNLParser.parsAanmeldResultaatNLPagina(pagina);

    //controleren of gebruiker is ingelogd
    if status = INGELOGD then
    begin

      //controleren of TVScanner voor het eerst is opgestart
      if eersteKeer then
      begin

        //www.TVScanner.nl informeren met SHA1 gebruikersnaam om versie te bemachtigen, tevens gebruiker kenmerk meesturen
        //actieveTVScannerVersie := internHttpClient.getNieuwsteVersie(TVGidsNLParser.getTVGidsNLGebruikerSHA1(pagina));

        //controleren of een juiste reactie van de tvscanner.nl website is ontvangen
        //if Pos('TVScanner', actieveTVScannerVersie) = 0 then
        //begin

          //geen melding tonen, aannemen dat de huidige versie de juiste is
          //actieveTVScannerVersie := TVScannerVersie;

          //geen eerste keer meer
          eersteKeer := False;
        //end;

        //controle naar active versie, bij een andere versie dit melden richting de gebruiker
        //if StrComp(Pchar(actieveTVScannerVersie), PChar(TVScannerVersie)) <> 0 then
        //  informatiePopup.showEenAndereTVScannerVersieMededeling(mededelingOnClickEvent);
      end;

      //controleren naar juiste pagina voor TVGidsNLParser
      if TVGidsNLParser.isPersoonlijkeVolledigOverzichtGernePagina(pagina) then
      begin

        //programma's ophalen uit de opgehaalde pagina
        TVGidsNLProgrammaLijst := TVGidsNLParser.parsPersoonlijkeVolledigOverzichtGernePagina(pagina);

        //controleren of gebruiker persoonlijke programma's heeft gepland
        if TVGidsNLProgrammaLijst.first then
        begin

          //programma's aan de gebruiker tonen
          Self.TVGidsNLProgrammaLijst := TVGidsNLProgrammaLijst;
        end
        else
        begin

          //gebruiker de mededeling tonen dat hij/zei geen persoonlijke programma's heeft
          informatiePopup.showEenGeenProgrammasMededeling(mededelingOnClickEvent);
        end;
      end;
    end
    else

    //controleren of gebruiker niet is ingelogd
    if status = NIET_INGELOGD then
    begin

      //gebruiker niet ingelogd mededeling tonen
      informatiePopup.showEenAanmeldenMededeling(mededelingOnClickEvent);
    end
    else

    //controleren of er iets fout is gegaan
    if status = ERROR then
    begin

      //gebruiker error mededeling tonen
      informatiePopup.showEenProbleemMededeling(mededelingOnClickEvent);
    end;

  end;

  {
    * onPopupMenuClick
  }
  procedure TTVScannerManager.showInternetPagina(pagina: String);
  begin

    //internetPagina_Form signaleren om naar de opgegeven pagina te navigeren
    internetPagina.showInternetPagina(pagina);
  end;

  {
    * onPopupMenuClick
  }
  procedure TTVScannerManager.onPopupMenuClick(Sender: TObject);
  begin

    //controle of gebruiker op TVScanner klikt
    if Sender = introductie.TVScanner then
    begin

      //signaleren om naar de TVScanner pagina te navigeren
      showInternetPagina('http://code.google.com/p/tvscanner/');
    end;

    //controle of gebruiker op TVGidsnlhoofdpagina klikt
    if Sender = introductie.TVGidsnlhoofdpagina then
    begin

      //signaleren om naar de TVGidsnlhoofdpagina pagina te navigeren
      showInternetPagina('http://www.tvgids.nl');
    end;

    //controle of gebruiker op MijnpersoonlijkeTvGids klikt
    if Sender = introductie.MijnpersoonlijkeTvGids then
    begin

      //signaleren om naar de MijnpersoonlijkeTvGids pagina te navigeren
      showInternetPagina('http://www.tvgids.nl/perstvgids/gids.php');
    end;

    //controle of gebruiker op NuenStraks klikt
    if Sender = introductie.NuenStraks then
    begin

      //signaleren om naar de NuenStraks pagina te navigeren
      showInternetPagina('http://www.tvgids.nl/nustraks/');
    end;

    //controle of gebruiker op Allesvanvandaag klikt
    if Sender = introductie.Allesvanvandaag then
    begin

      //signaleren om naar de Allesvanvandaag pagina te navigeren
      showInternetPagina('http://www.tvgids.nl/alleprogrammas/');
    end;

    //controle of gebruiker op Allesvanmorgen klikt
    if Sender = introductie.Allesvanmorgen then
    begin

      //signaleren om naar de Allesvanmorgen pagina te navigeren
      showInternetPagina('http://www.tvgids.nl/alleprogrammas/?interval=1&tab=0');
    end;

    //controle of gebruiker op TVScanner afsluiten klikt
    if Sender = introductie.TVScannerafsluiten then
    begin

      //programma signaleren om af te sluiten
      Application.Terminate();
    end;

  end;

  {
    * AfterConstruction
  }
  procedure TTVScannerManager.startManager;
  begin

    //eerste keer enabled zetten (wordt voor de versie update gebruikt nadat er op TVGidsNL is ingelogd)
    eersteKeer := True;

    //events voor task popup menu instellen
    introductie.TVScanner.OnClick := onPopupMenuClick;
    introductie.TVGidsnlhoofdpagina.OnClick := onPopupMenuClick;
    introductie.MijnpersoonlijkeTvGids.OnClick := onPopupMenuClick;
    introductie.NuenStraks.OnClick := onPopupMenuClick;
    introductie.Allesvanvandaag.OnClick := onPopupMenuClick;
    introductie.Allesvanmorgen.OnClick := onPopupMenuClick;
    introductie.TVScannerafsluiten.OnClick := onPopupMenuClick;

    //events voor internetPagina_Form instellen
    internetPagina.var_TriggerTVGidsNLDownload := triggerTVGidsNLDownload;
    internetPagina.var_ProcessTVGidsNLDownload := processTVGidsNLDownload;
  end;

  {
    * AfterConstruction
  }
  procedure TTVScannerManager.AfterConstruction;
  begin


  end;

  {
    * BeforeDestruction
  }
  procedure TTVScannerManager.BeforeDestruction;
  begin

  end;

end.
